package org.jflame.context.security.mask;

import org.jflame.commons.util.StringHelper;

import java.util.function.Function;

import org.apache.commons.lang3.StringUtils;

/**
 * 常用数据脱敏规则枚举. 支持规则: 地址,银行卡号,身份证号码,中文姓名,邮箱,手机号,固话号,车牌号
 * 
 * @author charles.zhang
 */
public enum MaskRule {

    NONE(new NoneMaskFunc()),
    /**
     * 住址,大于12位保留前6位,小于12保留前一半
     */
    ADDRESS(s -> {
        if (s.length() > 12) {
            return StringHelper.masked(s, 6, 0);
        } else {
            return StringHelper.masked(s, s.length() / 2, 0);
        }
    }),
    /**
     * 银行卡号,保留前6位和后4位
     */
    BANK_CARD(s -> StringHelper.masked(s, 6, 4)),
    /**
     * 身份证号码,保留前1位和后4位
     */
    CN_ID_CARD(s -> StringHelper.masked(s, 1, 4)),
    /**
     * 中文姓名,3个字以下保留后1位,3个字以上保留后2位
     */
    CN_NAME(s -> StringHelper.masked(s, 0, s.length() <= 3 ? 1 : 2)),
    /**
     * 邮箱,保留前1位和@后的内容
     */
    EMAIL(s -> s.charAt(0) + "***@" + StringUtils.substringAfter(s, "@")),
    /**
     * 手机号码,国内手机保留前3位和后4位,其他保留前后2位
     */
    MOBILE(s -> s.charAt(0) == '1' ? StringHelper.masked(s, 3, 4) : StringHelper.masked(s, 2, 3)),
    /**
     * 固定电话号码,保留后4位
     */
    TEL(s -> {
        if (s.charAt(0) == '0' && s.length() > 6) {
            return StringHelper.masked(s, 4, 4);// 有区号保留区号和后4位
        } else {
            return StringHelper.masked(s, 0, 4);
        }
    }),
    /**
     * 车牌号,保留前后各2位
     */
    PLATE_NO(s -> StringHelper.masked(s, 2, 2)),
    /**
     * 护照,保留前1位和后2位
     */
    PASSPORT(s -> StringHelper.masked(s, 1, 2));

    private Function<String,String> maskFunc;

    public static class NoneMaskFunc implements Function<String,String> {

        @Override
        public String apply(String t) {
            return t;
        }
    }

    private MaskRule(Function<String,String> maskFunc) {
        this.maskFunc = maskFunc;
    }

    public String value(String str) {
        return maskFunc.apply(str);
    }

    public Function<String,String> getMaskFun() {
        return maskFunc;
    }

}
